#!/bin/bash
#auteur : Frédéric CHEVALIER
#version : 2.0
#date de création : 2009-02-16
#date de modification : 2010-09-27


# ---------
# Variables
# ---------
# cx : choix
# dsa : dossier de sauvegarde
# dsc : dossier de stockage des scripts


# -----------------------
# Message d'avertissement
# -----------------------
zenity --info --title="Installateur - Script de Sauvegarde v 2.0" --text="Au cours de cette installation, vous devrez entrer votre mot de passe administrateur.
Assurez-vous que vous ayez bien les droits administrateurs. Sinon, contactez l'administrateur de l'ordinateur."





# ------------------------------------
# Installation des paquets nécessaires
# ------------------------------------
cx=$(zenity --list --title="Installateur - Script de Sauvegarde v 2.0" --text="S'agit-il d'un serveur de sauvegarde sous :" --column="" "1 - Microsoft Windows" "2 - GNU/Linux")


case $cx in

1 - Microsoft Windows)
if [ ! -f /sbin/mount.cifs ]
	then sudo -K | zenity --entry --hide-text --text="Veuillez entrer le mot de passe Sudo" | sudo -S -s
	sudo apt-get install -y smbfs
	type=smbfs
	echo OK
	else type=smbfs
	echo OK
fi
;;

2 - GNU/Linux)
if [ ! -f /sbin/mount.nfs ]
	then sudo -K | zenity --entry --hide-text --text="Veuillez entrer le mot de passe Sudo" | sudo -S -s
	sudo apt-get install -y nfs
	type=nfs
	echo OK
	else type=nfs
	echo OK
fi

esac




# ------------------------------
# Création du dossier de montage
# ------------------------------
cx=$(zenity --list --title="Installateur - Script de Sauvegarde v 2.0" --text="Création du dossier qui servira de point de montage du dossier sauvegarde présent sur le serveur distant :" --column="" "1 - par défaut /media/Sauvegarde" "2 - spécifier un dossier (attention à ne pas mettre de / à la fin du chemin)")

case $cx in

1 - par défaut /media/Sauvegarde)
dsa=/media/Sauvegarde
sudo -K | zenity --entry --hide-text --text="Veuillez entrer le mot de passe Sudo" | sudo -S -s
sudo mkdir "$dsa"
;;

2 - spécifier un dossier (attention à ne pas mettre de / à la fin du chemin))
zenity --info --title="Installateur - Script de Sauvegarde v 2.0" --text="Veuillez sélectionner le dossier dans lequel sera créé le point de montage"
d=$(zenity --file-selection --title="Installateur - Script de Sauvegarde v 2.0" --directory)
pm=$(zenity --entry --title="Installateur - Script de Sauvegarde v 2.0" --text="Quel nom doit porter le point de montage ?")
dsa="$d""$pm" # !!! bug dans le nom généré ??? !!!
sudo -K | zenity --entry --hide-text --text="Veuillez entrer le mot de passe Sudo" | sudo -S -s
sudo mkdir "$dsa"

esac




# --------------------------
# Création du dossier script
# --------------------------
cx=$(zenity --list --title="Installateur - Script de Sauvegarde v 2.0" --text="Création du dossier qui stockera les fichiers scripts nécessaires" --column="" "1 - par défaut $HOME/Sauvegarde" "2 - spécifier un dossier (attention à ne pas mettre de / à la fin du chemin)")

case $cx in

1 - par défaut $HOME/Sauvegarde)
dsc="$HOME"/Sauvegarde
mkdir "$dsc"
;;

2 - spécifier un dossier (attention à ne pas mettre de / à la fin du chemin))
zenity --info --title="Installateur - Script de Sauvegarde v 2.0" --text="Veuillez sélectionner le dossier dans lequel sera créé dossier contenant les futurs fichiers"
d=$(zenity --file-selection --title="Installateur - Script de Sauvegarde v 2.0" --directory)
f=$(zenity --entry --title="Installateur - Script de Sauvegarde v 2.0" --text="Quel nom doit porter le point de montage ?")
dsc="$d""$f" # !!! bug dans le nom généré ??? !!!
mkdir "$dsc"

esac




# ---------------------------------------------------------
# Récupération de l'UID et du GID de l'utilisateur en cours
# ---------------------------------------------------------
uid=$(grep $USER /etc/passwd | sed "s/:\([A-Z][a-z]\)/%/" | cut -d '%' -f1 | cut -d 'x' -f2 | sed -e "s/://" | sed -e "s/:\([0-9][0-9]*\)//")
gid=$(grep $USER /etc/passwd | sed "s/:\([A-Z][a-z]\)/%/" | cut -d '%' -f1 | cut -d 'x' -f2 | sed -e "s/://" | sed -e "s/\([0-9][0-9]*\)://")




# -------------------------------------------------------------------------
# Informations relatives au dossier de sauvegarde se situant sur le serveur
# -------------------------------------------------------------------------
cx=$(zenity --list --title="Installateur - Script de Sauvegarde v 2.0" --text="Quelle est l'adresse IP du serveur de sauvegarde ?" --column="" "1 - 10.16.137.10 (par défaut)" "2 - spécifiez-la")

case $cx in

1 - 10.16.137.10 (par défaut))
IP=10.16.137.10
;;
2 - spécifiez-la)
IP=$(zenity --entry --title="Installateur - Script de Sauvegarde v 2.0" --text="Entrez l'adresse IP du serveur :")
esac

nd=$(zenity --entry --title="Installateur - Script de Sauvegarde v 2.0" --text="Entrez le nom de votre dossier sur le serveur de sauvegarde (renseignez-vous en parcourant l'arborescence du réseau si nécessaire)")

username=$(zenity --entry --title="Installateur - Script de Sauvegarde v 2.0" --text="Entrez le login correspondant à votre dossier de sauvegarde :")

password=$(zenity --entry --title="Installateur - Script de Sauvegarde v 2.0" --text="Entrez le mot de passe correspondant à votre dossier de sauvegarde :")




# --------------------------------------------------------------------------
# Modification du fichier /etc/sudoers pour l'acquisition de nouveaux droits
# --------------------------------------------------------------------------

cx=$(zenity --list --title="Installateur - Script de Sauvegarde v 2.0" --text="Octroie du droit de monter une partition en tant qu'administrateur" --column="" "1 - Oui (mais création d'une faille de sécurité)" "2 - Non")

case $cx in

1 - Oui (mais création d\'une faille de sécurité))
if [ $type = smbfs ]
	then sudo -K | zenity --entry --hide-text --text="Veuillez entrer le mot de passe Sudo" | sudo -S -s
	sudo bash -c "
	cat >>/etc/sudoers <<EOT

# Autorisation du mount par l'utilisateur "$USER"
  $USER ALL=NOPASSWD:/sbin/mount.cifs

EOT"
fi

if [ $type = nfs ]
	then sudo -K | zenity --entry --hide-text --text="Veuillez entrer le mot de passe Sudo" | sudo -S -s
	sudo bash -c "
	cat >>/etc/sudoers <<EOT

# Autorisation du mount par l'utilisateur "$USER"
  $USER ALL=NOPASSWD:/sbin/mount.nfs

EOT"
fi
;;
2 - Non)

esac




cx=$(zenity --list --title="Installateur - Script de Sauvegarde v 2.0" --text="Octroie du droit de démonter une partition en tant qu'administrateur" --column="" "1 - Oui (mais création d'une faille de sécurité)" "2 - Non")

case $cx in

1 - Oui (mais création d\'une faille de sécurité))
if [ $type = smbfs ]
	then sudo -K | zenity --entry --hide-text --text="Veuillez entrer le mot de passe Sudo" | sudo -S -s
	sudo bash -c "
	cat >>/etc/sudoers <<EOT

# Autorisation du mount par l'utilisateur "$USER"
  $USER ALL=NOPASSWD:/sbin/umount.cifs

EOT"
fi

if [ $type = nfs ]
	then sudo -K | zenity --entry --hide-text --text="Veuillez entrer le mot de passe Sudo" | sudo -S -s
	sudo bash -c "
	cat >>/etc/sudoers <<EOT

# Autorisation du mount par l'utilisateur "$USER"
  $USER ALL=NOPASSWD:/sbin/umount.nfs

EOT"
fi
;;
2 - Non)

esac




cx=$(zenity --list --title="Installateur - Script de Sauvegarde v 2.0" --text="Octroie du droit d'éteindre le terminal en tant qu'administrateur" --column="" "1 - Oui (mais création d'une faille de sécurité)" "2 - Non")

case $cx in

1 - Oui (mais création d\'une faille de sécurité))
then sudo -K | zenity --entry --hide-text --text="Veuillez entrer le mot de passe Sudo" | sudo -S -s
sudo bash -c "
cat >>/etc/sudoers <<EOT

# Autorisation du shutdown par l'utilisateur "$USER"
  $USER ALL=NOPASSWD:/sbin/shutdown

EOT"
;;

2 - Non)

esac



# ------------------------
# Création du fichier list
# ------------------------

cx=$(zenity --list --title="Installateur - Script de Sauvegarde v 2.0" --text="Voulez-vous créer le fichier liste qui contiendra les dossiers à sauvegarder ?" --column="" "1 - Oui" "2 - Non (consulter les commentaires du script de sauvegarde pour connaître le formatage nécessaire)")

case $cx in

1 - Oui)
touch "$dsc"/list
a=0
while [ $a -eq 0 ]
do
d=$(zenity --file-selection --title="" --filename="$HOME/" --directory); if [ $? -eq 1 ];then rm "$dsc"/list; exit 1; fi;
n=$(zenity --entry --title="Installateur - Script de Sauvegarde v 2.0" --text="Indiquez le nom que doit porter le dossier sur le serveur"); if [ $? -eq 1 ];then rm "$dsc"/list; exit 1; fi;
echo "<$d> <$dsa/$n>" >> "$dsc"/list
cx=$(zenity --list --title="Installateur - Script de Sauvegarde v 2.0" --text="Voulez-vous ajouter un dossier ?" --column="" "1 - Oui" "2 - Non")
    if [ ! $cx -eq "1 - Oui" ]
        then a=1
    fi
done
;;

2 - Non (consulter les commentaires du script de sauvegarde pour connaître le formatage nécessaire))

esac




# --------------------------------
# Création du script de sauvegarde
# --------------------------------
cat >"$dsc"/Sauvegarde <<EOT
#!/bin/bash
#auteur : Frédéric CHEVALIER
#version : 2.4
#date de création : 2008-04-01
#date de modification : 2010-09-27


# pour donner un nom "raccourci" (incluant le chemin) au fichier backuperror.log :
backup="$dsc"/backuperror.log
# à noter l'usage des ">" : un seul ">" renvoie le contenu du terminal dans le fichier indiqué en écrasant tout ce que contient déjà ce fichier.
# ">>" renvoie le contenu du terminal sans écraser ce que contient déjà le fichier.
# Le chiffre "2" suivi d'un seul ">" renvoie seulement les messages d'erreurs générés par le processus dans le fichier indiqué
# en écrasant le contenu de ce fichier. "2>>" renvoie les erreurs sans écraser le contenu du fichier.





# -----------------------------
# Vérifie la présence du volume
# -----------------------------

# Vérifie la connexion au serveur de sauvegarde

if ! ping -c 1 $IP
then
echo "Erreur, vous n'êtes pas connecté au serveur de sauvegarde."
echo "Erreur, vous n'êtes pas connecté au serveur de sauvegarde." > $backup
date >> $backup
sleep 30
sudo shutdown -P now
exit
fi





# --------------------------------
# Monte la partition de sauvegarde
# --------------------------------

# le script effectue le montage de la partition "Sauvegarde" (dossier de sauvegarde situé sur le serveur de sauvegarde). Il est nécessaire d'avoir créer une dossier /media/Sauvegarde/ pour que le montage puisse se faire. D'autre part, le parquet smbfs doit être installé sur la machine.

sudo mount -t $type -o username="$username",password="$password",iocharset=utf8,uid="$uid",gid="$gid" //$IP/"$nd" "$dsa"





# -----------------------------------
# Lancement de la sauvegarde générale
# -----------------------------------

echo
echo "LA SAUVEGARDE GENERALE EST EN COURS D'EXECUTION AVANT ARRET DE L'ORDINATEUR"
echo


touch $backup

# Sauvegardes vers la partition de sauvegarde : ces sauvegardes se font à l'aide d'un fichier list (qui doit être généré à côté de ce script) dans lequel il est nécessaire de mettre les sources et destinations de la manière suivante :
#<source> <destination> (en ommettant le # de commentaire ici présent)
# e.g.: </home/fred/Bureau/Thèse> </media/Sauvegarde/Thèse>

if [ ! -s "$dsc"/list ]
then echo "le fichier list n'existe pas, il doit être créé (éditez le script de sauvegarde pour plus de renseignement (cf. ligne 69))"
echo "le fichier list n'existe pas, il doit être créé (éditez le script de sauvegarde pour plus de renseignement (cf. ligne 69))" >> $backup
sleep 30
exit
fi

cp "$dsc"/list "$dsc"/list.u
sed -i 's/> </>\n</g' "$dsc"/list.u
sed -i 's/<\|>//g' "$dsc"/list.u

while [ -s "$dsc"/list.u ]
do
s=$(sed q "$dsc"/list.u)
sed -i '1d' "$dsc"/list.u
d=$(sed q "$dsc"/list.u)
sed -i '1d' "$dsc"/list.u

rsync -a --progress -u --delete-after "$s" "$d" 2>> $backup

done

rm "$dsc"/list.u





# ----------------
# Rapport d'erreur
# ----------------
# Insertion de la date à la fin de la liste d'erreur si le fichier backuperror n'est pas vide (c'est à dire s'il y a des erreurs),
# ce que vérifie l'option "-s" :

if [ -s $backup ]
then date >> $backup
else rm $backup
fi





# ---------------------
# Arrêt de l'ordinateur
# ---------------------

sudo shutdown -P now

EOT

chmod u+x "$dsc"/Sauvegarde

ln -s "$dsc"/Sauvegarde "$HOME"/Bureau/Sauvegarde




# --------------------------------------
# Création du script de rapport d'erreur
# --------------------------------------

cat >"$dsc"/Rapport <<EOT
#!/bin/bash
# ce script est destiné à être exécuté en tache de fond lors du démarrage de l'ordinateur... Il a pour objet de signaler les éventuelles erreurs de la sauvegarde lancée lors de l'arrêt précédent de l'ordinateur.
#
# Pour donner un nom abrégé au fichier en indiquant le chemin correspondant.
# ("backuperror.log" est le fichier destiné à enregistrer les éventuelles erreurs de sauvegarde.)
backup=$dsc/backuperror.log
# Indique une action (l'édition par "gedit") si le fichier n'est pas vide (ce que vérifie l'option -s) :
if [ -s $backup ]; then
{
  gedit $backup
}
# efface le fichier pour qu'il ne soit ouvert au démarrage suivant de l'ordinateur que s'il a été recréé avec mention d'erreurs lors du déroulement de la sauvegarde suivante.
rm $backup
fi

EOT

chmod u+x $dsc/Rapport


echo "L'installation est terminé"
sleep 5

exit 0

